/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.datamodel.UsuariosDynamicDataModel;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dto.UsuarioDto;
import co.com.claro.administracionSolicitudes.entity.Cargo;
import co.com.claro.administracionSolicitudes.entity.Ciudad;
import co.com.claro.administracionSolicitudes.entity.Gerencia;
import co.com.claro.administracionSolicitudes.entity.Grupo;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import co.com.claro.administracionSolicitudes.entity.enums.GruposEnum;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author USUARIO
 */
@ManagedBean
@ViewScoped
public class ConsultaUsuariosBean {

    //--------------------------------------------------------------------------
    // Atributos
    //--------------------------------------------------------------------------
    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;

    private Grupo rol;

    private UsuariosDynamicDataModel usuarios;

    private int filas = 30;

    private String columnaSorteada;
    private boolean ascendiente;

    private final static String COL_DEFAULT_SORT = "nombres";

    private String usernameUsuario;
    private String numeroDocumento;
    private String cargoSeleccionado;
    private String gerenciaSeleccionada;
    private String ciudadSeleccionada;
    private String correoUsuario;
    private String rolSeleccionado;

    private List<SelectItem> cargosItems;
    private List<SelectItem> gerenciasItems;
    private List<SelectItem> ciudadesItems;
    private List<SelectItem> rolesItems;

    /**
     * Creates a new instance of ConsultaUsuariosBean
     */
    public ConsultaUsuariosBean() {
    }

    @PostConstruct
    public void inicializarValores() {
        rol = sesionBean.obtenerRolUsuario();

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = true;

        llenarFiltros();
        llenarUsuarios();
    }

    //--------------------------------------------------------------------------
    // Metodos propios del Bean
    //--------------------------------------------------------------------------
    private void llenarFiltros() {
        List<Gerencia> gerencias = localDatabase.findGerenciaByEstado(EstadoActividadEnum.ACTIVO.getId());
        List<Cargo> cargos = localDatabase.findCargoByEstado(EstadoActividadEnum.ACTIVO.getId());
        List<Ciudad> ciudades = localDatabase.findCiudadByEstado(EstadoActividadEnum.ACTIVO.getId());

        llenarCargos(cargos);
        llenarCiudades(ciudades);
        llenarGerencias(gerencias);
        llenarRoles();
    }

    private void llenarRoles() {
        if (rolesItems == null) {
            rolesItems = new ArrayList<SelectItem>();
        }

        rolesItems.add(new SelectItem(GruposEnum.ADMINISTRADOR.getId(), GruposEnum.ADMINISTRADOR.getNombre()));
        rolesItems.add(new SelectItem(GruposEnum.EJECUTOR.getId(), GruposEnum.EJECUTOR.getNombre()));
        rolesItems.add(new SelectItem(GruposEnum.ASIGNADOR.getId(), GruposEnum.ASIGNADOR.getNombre()));
        rolesItems.add(new SelectItem(GruposEnum.APROBADOR.getId(), GruposEnum.APROBADOR.getNombre()));
        rolesItems.add(new SelectItem(GruposEnum.SOLICITANTE.getId(), GruposEnum.SOLICITANTE.getNombre()));
    }

    private void llenarCiudades(List<Ciudad> ciudades) {
        if (ciudadesItems == null) {
            ciudadesItems = new ArrayList<SelectItem>();
        }
        for (Ciudad temporal : ciudades) {
            ciudadesItems.add(new SelectItem(temporal.getIdCiudad(), temporal.getNombre()));
        }
    }

    private void llenarCargos(List<Cargo> cargos) {
        if (cargosItems == null) {
            cargosItems = new ArrayList<SelectItem>();
        }
        for (Cargo temporal : cargos) {
            cargosItems.add(new SelectItem(temporal.getIdCargo(), temporal.getNombre()));
        }
    }

    private void llenarGerencias(List<Gerencia> gerencias) {
        if (gerenciasItems == null) {
            gerenciasItems = new ArrayList<SelectItem>();
        }
        for (Gerencia temporal : gerencias) {
            gerenciasItems.add(new SelectItem(temporal.getIdGerencia(), temporal.getNombre()));
        }
    }

    private void llenarUsuarios() {
        UsuarioDto dto = new UsuarioDto();

        dto.setActivo(EstadoActividadEnum.ACTIVO.getId());
        dto.setEstado(EstadoActividadEnum.ACTIVO.getId());
        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        if (usuarios == null) {
            if (rol.getIdGrupo().equals(GruposEnum.APROBADOR.getId())
                    && !rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())) {
                dto.setIdGerencia(sesionBean.getUsuario().getGerencia().getIdGerencia());
            }
            usuarios = new UsuariosDynamicDataModel(localDatabase, dto);
        }
    }

    //--------------------------------------------------------------------------
    // Eventos del Bean
    //--------------------------------------------------------------------------
    public void buscarUsuarios() {
        UsuarioDto dto = new UsuarioDto();

        if (rol.getIdGrupo().equals(GruposEnum.APROBADOR.getId())
                && !rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())) {
            dto.setIdGerencia(sesionBean.getUsuario().getGerencia().getIdGerencia());
        }

        if (usernameUsuario != null && !usernameUsuario.isEmpty()) {
            dto.setUsername(usernameUsuario);
        }
        if (numeroDocumento != null && !numeroDocumento.isEmpty()) {
            dto.setNumeroDocumento(Long.parseLong(numeroDocumento));
        }
        if (cargoSeleccionado != null) {
            dto.setIdCargo(Integer.parseInt(cargoSeleccionado));
        }
        if (gerenciaSeleccionada != null) {
            dto.setIdGerencia(Short.parseShort(gerenciaSeleccionada));
        }
        if (ciudadSeleccionada != null) {
            dto.setIdCiudad(Integer.parseInt(ciudadSeleccionada));
        }
        if (correoUsuario != null && !correoUsuario.isEmpty()) {
            dto.setCorreo(correoUsuario);
        }
        if (rolSeleccionado != null) {
            dto.setRol(Short.parseShort(rolSeleccionado));
        }
        
        dto.setActivo(EstadoActividadEnum.ACTIVO.getId());
        dto.setEstado(EstadoActividadEnum.ACTIVO.getId());
        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        usuarios = new UsuariosDynamicDataModel(localDatabase, dto);
    }

    public String buscarRolUsuario(Usuario usuario) {
        for (Grupo rolUusario : usuario.getGrupoList()) {
            return rolUusario.getNombre();
        }
        return null;
    }

    public String buscarUsernameUsuario(Usuario usuario) {
        return localDatabase.findUsuarioById(usuario.getIdUsuario()).getUsername();
    }

    public void limpiarCampos() {
        usernameUsuario = null;
        numeroDocumento = null;
        cargoSeleccionado = null;
        gerenciaSeleccionada = null;
        ciudadSeleccionada = null;
        correoUsuario = null;
        rolSeleccionado = null;

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = true;

        usuarios = null;

        llenarUsuarios();
    }

    public void ordenar() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteada.equals(property)) {
                ascendiente = !ascendiente;
            } else {
                columnaSorteada = property;
                ascendiente = true;
            }
        }

        System.out.println(ascendiente);

        buscarUsuarios();
    }

    public boolean paginado() {
        return usuarios.getTotalCount() > filas;
    }

    //--------------------------------------------------------------------------
    // Getters y Setters
    //--------------------------------------------------------------------------
    public UsuariosDynamicDataModel getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(UsuariosDynamicDataModel usuarios) {
        this.usuarios = usuarios;
    }

    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public String getUsernameUsuario() {
        return usernameUsuario;
    }

    public void setUsernameUsuario(String usernameUsuario) {
        this.usernameUsuario = usernameUsuario;
    }

    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    public String getColumnaSorteada() {
        return columnaSorteada;
    }

    public void setColumnaSorteada(String columnaSorteada) {
        this.columnaSorteada = columnaSorteada;
    }

    public boolean isAscendiente() {
        return ascendiente;
    }

    public void setAscendiente(boolean ascendiente) {
        this.ascendiente = ascendiente;
    }

    public int getFilas() {
        return filas;
    }

    public String getCargoSeleccionado() {
        return cargoSeleccionado;
    }

    public void setCargoSeleccionado(String cargoSeleccionado) {
        this.cargoSeleccionado = cargoSeleccionado;
    }

    public String getGerenciaSeleccionada() {
        return gerenciaSeleccionada;
    }

    public void setGerenciaSeleccionada(String gerenciaSeleccionada) {
        this.gerenciaSeleccionada = gerenciaSeleccionada;
    }

    public String getCiudadSeleccionada() {
        return ciudadSeleccionada;
    }

    public void setCiudadSeleccionada(String ciudadSeleccionada) {
        this.ciudadSeleccionada = ciudadSeleccionada;
    }

    public String getCorreoUsuario() {
        return correoUsuario;
    }

    public void setCorreoUsuario(String correoUsuario) {
        this.correoUsuario = correoUsuario;
    }

    public String getRolSeleccionado() {
        return rolSeleccionado;
    }

    public void setRolSeleccionado(String rolSeleccionado) {
        this.rolSeleccionado = rolSeleccionado;
    }

    public List<SelectItem> getCargosItems() {
        return cargosItems;
    }

    public void setCargosItems(List<SelectItem> cargosItems) {
        this.cargosItems = cargosItems;
    }

    public List<SelectItem> getGerenciasItems() {
        return gerenciasItems;
    }

    public void setGerenciasItems(List<SelectItem> gerenciasItems) {
        this.gerenciasItems = gerenciasItems;
    }

    public List<SelectItem> getCiudadesItems() {
        return ciudadesItems;
    }

    public void setCiudadesItems(List<SelectItem> ciudadesItems) {
        this.ciudadesItems = ciudadesItems;
    }

    public List<SelectItem> getRolesItems() {
        return rolesItems;
    }

    public void setRolesItems(List<SelectItem> rolesItems) {
        this.rolesItems = rolesItems;
    }

}
